package com.sap.sap_mangers.service;

import com.sap.sap_mangers.Vo.SawbsVo.ManagerForOrderVo;
import com.sap.sap_mangers.Vo.SawbsVo.ManagerForYearVo;
import com.sap.sap_mangers.Vo.SawbsVo.ManagerVo;
import com.sap.sap_mangers.Vo.SawbsVo.SawbsMessageVo;
import com.sap.sap_mangers.dto.sawbs.SawbsMessage;
import com.sap.sap_mangers.dto.sawbs.SawbsTaskSummary;
import com.sap.sap_mangers.pojo.*;
import com.sap.sap_mangers.until.SimpleJson;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author 樊东升
 * @date 2022/7/31 19:24
 */
public interface SawbsService {
    /**
     * 获取学习小组的信息
     *
     * @param sawbsMessage 学习小组的json封装对象，里面有两个属性，year和week
     * @return 学习小组 的视图类用于Json渲染
     */
    List<SawbsMessageVo> getSawbsMessage(SawbsMessage sawbsMessage);

    /**
     * 申请成为当前活动负责人Service
     *
     * @return 返回是否成功申请
     */
    SimpleJson applyToBeStudyGroupLeader();


    /**
     * 获取待审批的成员
     *
     * @return 获取待审批的成员
     */
    SimpleJson getApprovalMessage();

    /**
     * 会长审批负责人的申请
     * (事务支持)
     *
     * @param username 负责人的学号
     */
    void responsibleForApproval(String username);

    /**
     * 创建活动
     *
     * @param activity 活动信息
     */
    void createActivity(Activity activity);

    /**
     * 获取该负责人的被负责人信息
     */
    SimpleJson getManagerUsers();

    /**
     * 获得所有负责人与被负责人的对应关系（包括信息）
     *
     * @return 对应关系
     */
    List<ManagerCorrespondence> getAllManagerCorrespondenceDefaultByDynamicTable(DynamicMessage dynamicMessage);

    /**
     * 获取该用户的负责人的id（学号）
     *
     * @return 负责人学号
     */
    String getMangerId();

    /**
     * 通过学号获取这个学号是否拥有负责人的信息，如果拥有则返回信息
     *
     * @param username 学号
     * @return 负责人信息
     */
    SapSawbsMangers getSapSawbsMangers(String username);

    /**
     * 成员退出 (无参，用户名通过token获取)
     */
    void memberExit();

    /**
     * 管理员退出 (无参，用户名通过token获取)
     * 管理员退出后要将当前周还没有进行评分的成员分配给会长
     */
    void managerExit();

    /**
     * 获取本周学习任务
     *
     * @return 本周学习任务
     */
    SapSawbsTask getTaskThisWeek();

    /**
     * 获取本次活动每周的学习任务(集合)
     *
     * @return 本次活动每周的学习任务集合
     */
    List<SapSawbsTask> getTaskThisOrder();

    /**
     * 获取指定活动每周的学习任务(集合)
     *
     * @param year  指定活动的年份
     * @param order 指定是此年的第几次活动
     * @return 指定活动每周的学习任务集合
     */
    List<SapSawbsTask> getTaskByCondition(Integer year, Integer order);

    /**
     * 写入每周学习情况
     *
     * @param sawbsMessageVo 学习情况
     * @return 返回信息
     */
    SimpleJson writeSawbsMessageVo(SawbsMessageVo sawbsMessageVo);

    /**
     * 查询自己某一周的学习信息（分数）
     *
     * @param sawbsMessageVo 时间+自己的学号
     * @return 学习分数
     */
    SimpleJson getWeekScore(SawbsMessageVo sawbsMessageVo);

    /**
     * 查询某一届学习小组的成员信息
     *
     * @param year 学年
     * @return 全部成员信息
     */
    SimpleJson getUsersActivityMessageOfYear(Integer year);

    /**
     * 获取当前的软协小队活动详细信息
     *
     * @return 当前的软协小队活动详细信息
     */
    SapSawbsActivity getThisSawbsActivity();

    /**
     * 查询指定小队活动的详细信息
     *
     * @param year  活动年份
     * @param order 活动次数
     * @return 指定小队活动的详细信息
     */
    SapSawbsActivity getSawbsActivityByCondition(Integer year, Integer order);

    /**
     * 获取所有小队活动的详细信息 (按活动的时间(年份和次数)从近到远排序 年份从大到小，次数从大到小)
     *
     * @return 所有小队活动的详细信息集合 (按活动的时间(年份和次数)从近到远排序)
     */
    List<SapSawbsActivity> getAllSawbsActivities();

    /**
     * 添加每周任务
     *
     * @param theme     每周任务主题
     * @param context   任务内容
     * @param fileName  上传的文件名字
     * @param imageName 上传的图片名字
     * @return 视图
     */
    SimpleJson addTaskForWeek(MultipartFile file, MultipartFile image, String theme, String context, String fileName, String imageName);

    /**
     * 修改学习评价
     *
     * @param sawbsMessageVo 需要修改的信息
     * @return 修改状况（携带了修改后对应表该行的信息）
     */
    SimpleJson updateSawbsMessageVo(SawbsMessageVo sawbsMessageVo);

    /**
     * 判断在score表中是否已经写入对用户的学习评价
     *
     * @param sawbsMessageVo 用户信息
     * @return true说明存在
     */
    boolean existUserScoreInSawbsScoreTable(SawbsMessageVo sawbsMessageVo);

    /**
     * 生成每周的负责人匹配关系
     * (将未退出的负责人和成员随机匹配，生成新一周的负责表)
     * (其中的周数直接从动态表获取，注意更新周数的逻辑的位置)
     * (失败事务会回滚)
     *
     * @return 返回数字代表结果
     */
    int createWeeklyManagerMatchingRelationship();

    /**
     * 通过年份获取当前学年所有次序活动的所有周的总结
     *
     * @param year 学年
     * @return 视图
     */
    SimpleJson getSummaryMessageByYear(String year);

    /**
     * 通过学年和次序来获取学年所对应次序活动所有周的总结
     *
     * @param year  学年
     * @param order 活动次序
     * @return 视图
     */
    SimpleJson getSummaryMessageByOrder(String year, String order);

    /**
     * 通过学年和次序来获取学年所队友的活动次序的所对应周的的总结
     *
     * @param year  学年
     * @param order 活动次序
     * @param week  周
     * @return 视图
     */
    SimpleJson getSummaryMessageByWeek(String year, String order, String week);

    /**
     * 通过学年来获取这个学年的总结
     *
     * @param year 学年
     * @return 视图
     */
    SimpleJson getSummaryMessageOfYear(String year);

    /**
     * 通过学年和活动次序来获取这个活动次序的总结
     *
     * @param year  学年
     * @param order 活动次序
     * @return 视图
     */
    SimpleJson getSummaryMessageOfOrder(String year, String order);

    /**
     * 通过动态表的内容获取当前周的总结
     *
     * @return 视图
     */
    SimpleJson getSummaryMessageByDynamic();

    /**
     * 添加任务表的service
     *
     * @param sawbsTaskSummary 任务表内容
     * @param imageUrlList     图片url列表
     * @return 视图
     */
    SimpleJson addSummaryMessage(SawbsTaskSummary sawbsTaskSummary, List<String> imageUrlList);

    /**
     * 修改总结表的service
     *
     * @param sawbsTaskSummary 任务表内容
     * @param imageUrlList     图片url列表
     * @return 视图
     */
    SimpleJson updateTaskSummaryMessage(SawbsTaskSummary sawbsTaskSummary, List<String> imageUrlList);

    /**
     * 获取分数给用户端渲染图表
     *
     * @param order 活动次序
     * @return 视图
     */
    SimpleJson getScoreForView(Integer order);


    /**
     * 获取当前周的分数信息
     *
     * @param dynamicMessage 当前周
     * @return
     */
    List<SapSawbsScore> getScoreForWeek(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取当前学年任意一次活动的总分
     *
     * @param order
     * @return
     */
    List<SawbsMessageVo> getScoreForOrder(Integer order);

    /**
     * 获取任意一年的分数信息
     *
     * @param year 任意一年
     * @return
     */
    List<SapSawbsScore> getScoreForAnyYear(Integer year);

    /**
     * 获取个人用户任意一周分数
     *
     * @param dynamicMessage 周数
     * @return ..
     */
    SapSawbsScore getScoreForUser(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取个人用户任意活动每周的分数
     *
     * @param dynamicMessage 活动次数
     * @return ..
     */
    List<SapSawbsScore> getScoreForUserOrder(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取个人用户任意每学年每周的分数
     *
     * @param dynamicMessage 学年
     * @return ..
     */
    List<SapSawbsScore> getScoreForUserYear(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取个人的分数总分表
     *
     * @param year     学年
     * @param order    活动次序
     * @param username 学号
     * @return ..
     */
    SapSawbsScore getScoreSumForUser(Integer year, Integer order, String username);

    /**
     * 获取个人任意学年所有活动的总分
     *
     * @param year     学年
     * @param username 学号
     * @return ..
     */

    List<SapSawbsScore> getSumYearAndScoreForUser(Integer year, String username);

    /**
     * 获取个人任意学年所有活动的总分
     *
     * @param year     学年
     * @param username 学号
     * @return ..
     */

    SapSawbsScore getScoreSumForUserYear(Integer year, String username);

    /**
     * 获取当前用户任意一周的负责人
     *
     * @param dynamicMessage 参数信息
     * @return ..
     */
    SimpleJson getUserManagerForWeek(DynamicMessage dynamicMessage);

    /**
     * 获取当前用户当前任意活动所有负责人的详情
     *
     * @param dynamicMessage ..
     * @return ..
     */
    ManagerForOrderVo getUserManagerForOrder(DynamicMessage dynamicMessage);

    /**
     * 获取当前用户任意学年所有活动负责人的详情
     *
     * @param dynamicMessage
     * @return
     */
    ManagerForYearVo getUserManagerForYear(DynamicMessage dynamicMessage);


    /**
     * 活动记录的所有年，次，周 获取
     * 1.什么都不传 获取所有年份
     * 2.传 year 得到 所有order
     * 3.传 year,order 得到最大week
     *
     * @param year  某年
     * @param order 某次
     * @return 所有次 或 所有周
     */
    SimpleJson getSawbsActivityRecordOfYearOrderWeek(Integer year, Integer order);

    /**
     * 增加活动次数记录 --> record_table表
     *
     * @param year  年
     * @param order 次数
     */
    void addActivityOrderForRecordTable(Integer year, Integer order);

    /**
     * 获取当前用户历史所有负责人详情
     *
     * @return ..
     */
    ManagerVo getUserForManager();


    /**
     * 获取用户最后一次活动的信息
     *
     * @param username 学号
     * @return
     */
    SapSawbsScore getSapSawbsScoreByUserLastOrder(@Param("username") String username);

    /**
     * 获取负责人任意周对应的用户(个人)
     *
     * @param dynamicMessage 年份日期
     * @return
     */
    SimpleJson getManagerForUserWeek(DynamicMessage dynamicMessage);

    /**
     * 获取负责人任意活动对应的所有用户(个人)
     *
     * @param dynamicMessage 学年活动次数
     * @return
     */
    SimpleJson getManagerForUserOrder(DynamicMessage dynamicMessage);

    /**
     * 获取负责人任意学年对应的所有用户(个人)
     *
     * @param dynamicMessage 学年
     * @return
     */
    SimpleJson getManagerForUserYear(DynamicMessage dynamicMessage);

    /**
     * 获取负责人历史所有用户(个人)
     *
     * @return
     */
    SimpleJson getManagerForUser();


    /**
     * 添加用户到当前活动的学习小组
     *
     * @param dynamicMessage 动态信息
     */
    SimpleJson applySapStudy(DynamicMessage dynamicMessage);

    /**
     * 判断是否已经加入软件协会学习小组
     *
     * @param dynamicMessage 动态表
     * @return
     */
    SimpleJson isJoinSapStudy(DynamicMessage dynamicMessage);

    /**
     * 退出当前学习活动
     *
     * @param dynamicMessage 动态信息
     */
    SimpleJson quitSawbs(DynamicMessage dynamicMessage);

    /**
     * 个人用户提交任务(每周)
     *
     * @param dynamicMessage 动态信息
     * @return 视图
     */
    SimpleJson submitSawbsForWeek(DynamicMessage dynamicMessage, MultipartFile file);

    /**
     * 判断是否提交了任务(每周)
     *
     * @param dynamicMessage 动态信息
     * @return 视图
     */
    SimpleJson isSubmitForWeek(DynamicMessage dynamicMessage);

    /**
     * 修改提交的笔记或者作业或者任务结果
     *
     * @param dynamicMessage 动态信息
     * @param file           文件
     * @return 视图
     */
    SimpleJson updateSubmitTaskForWeek(DynamicMessage dynamicMessage, MultipartFile file);

    /**
     * 通过年，次，周获取当前用户任务提交的信息
     *
     * @return 用户提交信息
     */
    SimpleJson getTaskInfoByYearOrderWeek(Integer year, Integer order, Integer week, Integer submit);

    /**
     * 获取负责人当前周的上交情况
     *
     * @return
     */
    SimpleJson getTaskInfoByUsername();

    /**
     * 给没有上交文件的同学发送邮件提醒
     */
    void sendReminders();
}
